Introducción al Manejo de Datos en R con {tidyverse}

R para Ciencia de Datos en Salud:
Análisis Descriptivo e Inferencia Estadística

Percy Soto-Becerra M.D., M.Sc(c)

InkaStats Data Science Solutions | Medical Branch
@github/psotob91

Datos ‘tidy’

Datos ‘tidy’




Características de los datos ordenados o ‘tidy’

  • Cada variable forma un columna.
  • Cada observación forma una fila.
  • Cada tipo de unidad observacional forma una tabla.

Características de los datos desordenados o ‘untidy’

!@#$%^&*()

Gramática de manejo de datos


Al igual que ggplot, el paquete dplyr, también de {tidyverse}, ofrece toda una gramática llena de funciones que actúan como verbos para manipular data.frames.

  • select: extrae columnas usando nombres
  • arrange: reordena filas
  • slice: extrae filas usando índices
  • filter: extrae filas que coincidan con criterios lógicos
  • distinct: filtra por filas únicas
  • mutate: agrega nuevas variables
  • summarise: reduce variables a valores
  • group_by: para operacionesa agrupadas
  • … (mucho más)

Reglas de las funciones de {dplyr}


  • El primer argumento siempre es el data frame.

  • Los argumentos subsecuentes dicen qué hacer con el data frame.

  • Siempre retorna un data frame.

  • No altera el data frame original.

Datos: gapminder, otra vez…


  • Data disponible en paquete {dslabs}.
library(dslabs)
data(gapminder, package = "dslabs") 
  • Veamos un resumen de estos datos:
glimpse(gapminder)
Rows: 10,545
Columns: 9
$ country          <fct> "Albania", "Algeria", "Angola", "Antigua and Barbuda"…
$ year             <int> 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960,…
$ infant_mortality <dbl> 115.40, 148.20, 208.00, NA, 59.87, NA, NA, 20.30, 37.…
$ life_expectancy  <dbl> 62.87, 47.50, 35.98, 62.97, 65.39, 66.86, 65.66, 70.8…
$ fertility        <dbl> 6.19, 7.65, 7.32, 4.43, 3.11, 4.55, 4.82, 3.45, 2.70,…
$ population       <dbl> 1636054, 11124892, 5270844, 54681, 20619075, 1867396,…
$ gdp              <dbl> NA, 13828152297, NA, NA, 108322326649, NA, NA, 966778…
$ continent        <fct> Europe, Africa, Africa, Americas, Americas, Asia, Ame…
$ region           <fct> Southern Europe, Northern Africa, Middle Africa, Cari…
head(gapminder)
              country year infant_mortality life_expectancy fertility
1             Albania 1960           115.40           62.87      6.19
2             Algeria 1960           148.20           47.50      7.65
3              Angola 1960           208.00           35.98      7.32
4 Antigua and Barbuda 1960               NA           62.97      4.43
5           Argentina 1960            59.87           65.39      3.11
6             Armenia 1960               NA           66.86      4.55
  population          gdp continent          region
1    1636054           NA    Europe Southern Europe
2   11124892  13828152297    Africa Northern Africa
3    5270844           NA    Africa   Middle Africa
4      54681           NA  Americas       Caribbean
5   20619075 108322326649  Americas   South America
6    1867396           NA      Asia    Western Asia

Ejemplo de función {dplyr} en acción: seleccionar columna


Ver solamente country (países):

select(gapminder, country)
# A tibble: 10,545 × 1
   country            
   <fct>              
 1 Albania            
 2 Algeria            
 3 Angola             
 4 Antigua and Barbuda
 5 Argentina          
 6 Armenia            
 7 Aruba              
 8 Australia          
 9 Austria            
10 Azerbaijan         
# … with 10,535 more rows

Reglas de las funciones de {dplyr} en acción


select(
  gapminder, 
  country
)
  • Inicia con la función (un verbo): select()

Reglas de las funciones de {dplyr} en acción


select(
  gapminder, 
  country
)
  • Inicia con la función (un verbo): select()

  • Primer arugmento: data frame con el que trabajaremos, gapminder

Reglas de las funciones de {dplyr} en acción


select(
  gapminder, 
  country
)
  • Inicia con la función (un verbo): select()

  • Primer arugmento: data frame con el que trabajaremos, gapminder

  • Segundo argumento: variable que queremos seleccionar, country

Reglas de las funciones de {dplyr} en acción


select(
  gapminder, 
  country
)
# A tibble: 10,545 × 1
   country            
   <fct>              
 1 Albania            
 2 Algeria            
 3 Angola             
 4 Antigua and Barbuda
 5 Argentina          
 6 Armenia            
 7 Aruba              
 8 Australia          
 9 Austria            
10 Azerbaijan         
# … with 10,535 more rows
  • Inicia con la función (un verbo): select()

  • Primer arugmento: data frame con el que trabajaremos, gapminder

  • Segundo argumento: variable que queremos seleccionar, country

  • Resultado: data frame con 10545 filas y 1 columna

Las funciones de dplyr siempre esperan un data frame y siempre generan un data frame.


select(gapminder, continent)
# A tibble: 10,545 × 1
   continent
   <fct>    
 1 Europe   
 2 Africa   
 3 Africa   
 4 Americas 
 5 Americas 
 6 Asia     
 7 Americas 
 8 Oceania  
 9 Europe   
10 Asia     
# … with 10,535 more rows

El Operador Pipe

¿Qué es un pipe?


En programación, un pipe es una técnica para transmitir información de un proceso a otro.


  • En R, hay dos operadores pipe:

    • pipe de tidyverse: %>%

    • pipe nativo (de R base):|>

  • En este curso, usaremos el pipe de tidyverse: %>%

  • El operador pipe de tidyverse es del paquete {magrittr}, que no necesita ser cargado si es que se carga {tidyverse}.

%>% en acción


Este operador conecta secuencia de acciones en forma de código:

yo
despierto a las 8 horas
salgo de cama por el lado derecho
visto pantalones y polo
salgo de casa con carro sin bicicleta



yo %>% 
  despertar(tiempo = "8:00") %>% 
  salir_de_cama(lado = "derecha") %>% 
  vestir(pantalones = TRUE, polo = TRUE) %>% 
  salir_de_casa(carro = TRUE, bicicleta = TRUE)


Atajo de teclado del operador pipe:

  • Ctrl + Shift + M

  • Ctrl + + M

Un ejemplo de uso de %>%


Sin %>%:

datos_fase1 <- read_stata("maca_meno_fase1.dta") 
datos_fase1 <- as_factor(datos_fase1)
  • El código es redundante: repites tres veces datos_fase1.
head(datos_fase1)
# A tibble: 6 × 14
     id time   treat   age race  married married2 procedence weight height    e2
  <dbl> <fct>  <fct> <dbl> <chr> <fct>   <fct>    <chr>       <dbl>  <dbl> <dbl>
1     1 Basel… Plac…    33 Mest… Single  Without… Callao       59      1.4  87.3
2     1 3 mon… Plac…    32 Mest… Single  Without… Callao       59.9    1.3 210. 
3     2 Basel… Dosi…    27 Mest… Single  Without… Santa Ani…   62      1.5 169. 
4     2 3 mon… Dosi…    27 Mest… Single  Without… Santa Ani…   62.1    1.6  99.9
5     3 Basel… Dosi…    25 Mest… Single  Without… Callao       62      1.6  78.8
6     3 3 mon… Dosi…    25 Mest… Single  Without… Callao       60      1.6 155. 
# … with 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>

Con %>%:

datos_fase1 <- read_stata("maca_meno_fase1.dta") %>% 
  as_factor()
  • El código es más simple y directo, datos_fase1 solo se repite una vez.
head(datos_fase1)
# A tibble: 6 × 14
     id time   treat   age race  married married2 procedence weight height    e2
  <dbl> <fct>  <fct> <dbl> <chr> <fct>   <fct>    <chr>       <dbl>  <dbl> <dbl>
1     1 Basel… Plac…    33 Mest… Single  Without… Callao       59      1.4  87.3
2     1 3 mon… Plac…    32 Mest… Single  Without… Callao       59.9    1.3 210. 
3     2 Basel… Dosi…    27 Mest… Single  Without… Santa Ani…   62      1.5 169. 
4     2 3 mon… Dosi…    27 Mest… Single  Without… Santa Ani…   62.1    1.6  99.9
5     3 Basel… Dosi…    25 Mest… Single  Without… Callao       62      1.6  78.8
6     3 3 mon… Dosi…    25 Mest… Single  Without… Callao       60      1.6 155. 
# … with 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>

Principios del manejo de datos con {dplyr}

El paquete {dplyr} es una ‘suite’ de funciones para manipular data frame.


Verbos Función
Extrae filas con filter()
Extrae columnas con select()
Reordena filas con arrange()
Crea nuevas / remplaza columnas con mutate
Haz resumenes agrupados con group_by() y summarize()

Selección de columnas con select()


  • La función select() selecciona o excluye columnas.

  • El signo - permite elegir qué columnas eliminar.

  • A veces es mejor llamarla usando: dplyr::select() debido a que otros paquetes también tienen una función con el mismo nombre.

Larga

select(.data = DATA, ...)


Abreviada

select(DATA, ...)


Se estila usar %>%

DATA %>% 
  select(...)


Argumento Descripción
.data Data frame o extensión de data frame (por ejemplo, tibble).
... Una o más nombres de variables sin ' ' o expresiones como x:y que permiten seleccionar rango de variables.

select() en acción

  • Si solo quiero seleccionar a id, time, age, race y procedence:
datos_fase1 %>% 
  select(id, time, age, race, procedence)
# A tibble: 106 × 5
      id time       age race    procedence 
   <dbl> <fct>    <dbl> <chr>   <chr>      
 1     1 Baseline    33 Mestiza Callao     
 2     1 3 months    32 Mestiza Callao     
 3     2 Baseline    27 Mestiza Santa Anita
 4     2 3 months    27 Mestiza Santa Anita
 5     3 Baseline    25 Mestiza Callao     
 6     3 3 months    25 Mestiza Callao     
 7     4 Baseline    37 Mestiza Callao     
 8     4 3 months    38 Mestiza Callao     
 9     5 Baseline    31 Mestiza La Molina  
10     5 3 months    32 Mestiza La Molina  
# … with 96 more rows
  • Si quisiera excluir a procedence:
datos_fase1 %>% 
  select(-procedence)
# A tibble: 106 × 13
      id time     treat     age race  married married2 weight height    e2    lh
   <dbl> <fct>    <fct>   <dbl> <chr> <fct>   <fct>     <dbl>  <dbl> <dbl> <dbl>
 1     1 Baseline Placebo    33 Mest… Single  Without…   59      1.4  87.3  3.28
 2     1 3 months Placebo    32 Mest… Single  Without…   59.9    1.3 210.  26.8 
 3     2 Baseline Dosis 2    27 Mest… Single  Without…   62      1.5 169.   6.34
 4     2 3 months Dosis 2    27 Mest… Single  Without…   62.1    1.6  99.9  5.77
 5     3 Baseline Dosis 1    25 Mest… Single  Without…   62      1.6  78.8 11.9 
 6     3 3 months Dosis 1    25 Mest… Single  Without…   60      1.6 155.  10.1 
 7     4 Baseline Dosis 1    37 Mest… Divorc… Without…   60.9    1.5  41.0  4.57
 8     4 3 months Dosis 1    38 Mest… Divorc… Without…   61.4    1.5 109.   7.29
 9     5 Baseline Placebo    31 Mest… Single  Without…   64      1.5  43.0  7.81
10     5 3 months Placebo    32 Mest… Single  Without…   58.1    1.6  56.0  9.15
# … with 96 more rows, and 2 more variables: fsh <dbl>, prog <dbl>
  • Si se quiere seleccionar variables contiguas age, race, married, married2, y procedence.
datos_fase1 %>% 
  select(age:procedence)
# A tibble: 106 × 5
     age race    married  married2       procedence 
   <dbl> <chr>   <fct>    <fct>          <chr>      
 1    33 Mestiza Single   Without couple Callao     
 2    32 Mestiza Single   Without couple Callao     
 3    27 Mestiza Single   Without couple Santa Anita
 4    27 Mestiza Single   Without couple Santa Anita
 5    25 Mestiza Single   Without couple Callao     
 6    25 Mestiza Single   Without couple Callao     
 7    37 Mestiza Divorced Without couple Callao     
 8    38 Mestiza Divorced Without couple Callao     
 9    31 Mestiza Single   Without couple La Molina  
10    32 Mestiza Single   Without couple La Molina  
# … with 96 more rows
  • Se usa el operador <-:
datos_fase1_select <- datos_fase1 %>% 
  select(id, time, treat, age, race)
  • También se puede invertir el operador ->:
datos_fase1 %>% 
    select(id, time, treat, age, procedence) -> datos_fase1_select
  • Una vez guardado como objeto, podemos reutilizarlo para otros fines:
datos_fase1_select
# A tibble: 106 × 5
      id time     treat     age procedence 
   <dbl> <fct>    <fct>   <dbl> <chr>      
 1     1 Baseline Placebo    33 Callao     
 2     1 3 months Placebo    32 Callao     
 3     2 Baseline Dosis 2    27 Santa Anita
 4     2 3 months Dosis 2    27 Santa Anita
 5     3 Baseline Dosis 1    25 Callao     
 6     3 3 months Dosis 1    25 Callao     
 7     4 Baseline Dosis 1    37 Callao     
 8     4 3 months Dosis 1    38 Callao     
 9     5 Baseline Placebo    31 La Molina  
10     5 3 months Placebo    32 La Molina  
# … with 96 more rows

Arreglar en orden ascendente / descendente con arrange()

datos_fase1_select %>% 
  arrange(age)
# A tibble: 106 × 5
      id time     treat     age procedence
   <dbl> <fct>    <fct>   <dbl> <chr>     
 1    40 Baseline Placebo    20 VES       
 2    40 3 months Placebo    20 VES       
 3    20 Baseline Placebo    22 Surquillo 
 4    20 3 months Placebo    22 Surquillo 
 5    29 Baseline Dosis 1    23 SJL       
 6    29 3 months Dosis 1    23 SJL       
 7    39 Baseline Dosis 2    23 Callao    
 8    39 3 months Dosis 2    23 Callao    
 9     3 Baseline Dosis 1    25 Callao    
10     3 3 months Dosis 1    25 Callao    
# … with 96 more rows
datos_fase1_select %>% 
  arrange(desc(age))
# A tibble: 106 × 5
      id time     treat     age procedence
   <dbl> <fct>    <fct>   <dbl> <chr>     
 1    22 Baseline Dosis 1    41 Chorrillos
 2    22 3 months Dosis 1    41 Chorrillos
 3    33 Baseline Dosis 2    41 SJL       
 4    33 3 months Dosis 2    41 SJL       
 5    51 Baseline Dosis 1    41 Surco     
 6    51 3 months Dosis 1    41 Surco     
 7    17 Baseline Placebo    40 Surquillo 
 8    17 3 months Placebo    40 Surquillo 
 9    28 Baseline Dosis 2    40 SJL       
10    28 3 months Dosis 2    40 SJL       
# … with 96 more rows

Seleccionar filas


  • De acuerdo a índice (posición de fila):

    • slice( )
  • De acuerdo a condición:

    • filter( )

Rebanar filas con slice()

  • Seleccionar las 3 primeras filas:
datos_fase1 %>% 
  slice(1:3)
# A tibble: 3 × 14
     id time   treat   age race  married married2 procedence weight height    e2
  <dbl> <fct>  <fct> <dbl> <chr> <fct>   <fct>    <chr>       <dbl>  <dbl> <dbl>
1     1 Basel… Plac…    33 Mest… Single  Without… Callao       59      1.4  87.3
2     1 3 mon… Plac…    32 Mest… Single  Without… Callao       59.9    1.3 210. 
3     2 Basel… Dosi…    27 Mest… Single  Without… Santa Ani…   62      1.5 169. 
# … with 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>
  • Seleccionar las filas 3, 6, 10:
datos_fase1 %>% 
  slice(c(3, 6, 10))
# A tibble: 3 × 14
     id time   treat   age race  married married2 procedence weight height    e2
  <dbl> <fct>  <fct> <dbl> <chr> <fct>   <fct>    <chr>       <dbl>  <dbl> <dbl>
1     2 Basel… Dosi…    27 Mest… Single  Without… Santa Ani…   62      1.5 169. 
2     3 3 mon… Dosi…    25 Mest… Single  Without… Callao       60      1.6 155. 
3     5 3 mon… Plac…    32 Mest… Single  Without… La Molina    58.1    1.6  56.0
# … with 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>
  • Excluir filas 1 y 3
datos_fase1 %>% 
  slice(-c(1, 3))
# A tibble: 104 × 14
      id time  treat   age race  married married2 procedence weight height    e2
   <dbl> <fct> <fct> <dbl> <chr> <fct>   <fct>    <chr>       <dbl>  <dbl> <dbl>
 1     1 3 mo… Plac…    32 Mest… Single  Without… Callao       59.9    1.3 210. 
 2     2 3 mo… Dosi…    27 Mest… Single  Without… Santa Ani…   62.1    1.6  99.9
 3     3 Base… Dosi…    25 Mest… Single  Without… Callao       62      1.6  78.8
 4     3 3 mo… Dosi…    25 Mest… Single  Without… Callao       60      1.6 155. 
 5     4 Base… Dosi…    37 Mest… Divorc… Without… Callao       60.9    1.5  41.0
 6     4 3 mo… Dosi…    38 Mest… Divorc… Without… Callao       61.4    1.5 109. 
 7     5 Base… Plac…    31 Mest… Single  Without… La Molina    64      1.5  43.0
 8     5 3 mo… Plac…    32 Mest… Single  Without… La Molina    58.1    1.6  56.0
 9     6 Base… Plac…    38 Mest… Married With co… Los Olivos   54.5    1.5  36.2
10     6 3 mo… Plac…    38 Mest… Married With co… Los Olivos   53.9    1.5  44.7
# … with 94 more rows, and 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>

Filtrado de filas con filter()


  • La función filter() selecciona individuos que cumplen una condición lógica.

  • Se debe usar operadores booleanos para construir condiciones lógicas simples o complejas.

Larga

filter(.data = DATA, ...)


Abreviada

filter(DATA, ...)


Se estila usar %>%

DATA %>% 
  filter(...)


Argumento Descripción
.data Data frame o extensión de data frame (por ejemplo, tibble).
... Uno o más condiciones o pruebas que filter() evaluará en cada fila y seleccionará solo las condiciones que resulten verdaderas: TRUE.

Operadores lógicos con R


Operador Definición Operador Definición
< menor que A | B A o B
<= menor o igual que is.na(A) evalúa si A es NA
> mayor que !is.na(A) evalúa si A no es NA
>= mayor o igual que A %in% B evalúa si A está en B
== exactamente igual a !(A %in% B) evalúa si A no está en B
!= diferente de !A no A
A & B A y B

filter() en acción

  • Si se filtra solo para tener a los individuos en su medición basal:
datos_fase1_select %>% 
  filter(time == "Baseline")
# A tibble: 53 × 5
      id time     treat     age procedence  
   <dbl> <fct>    <fct>   <dbl> <chr>       
 1     1 Baseline Placebo    33 Callao      
 2     2 Baseline Dosis 2    27 Santa Anita 
 3     3 Baseline Dosis 1    25 Callao      
 4     4 Baseline Dosis 1    37 Callao      
 5     5 Baseline Placebo    31 La Molina   
 6     6 Baseline Placebo    38 Los Olivos  
 7     7 Baseline Dosis 1    26 SMP         
 8     8 Baseline Placebo    34 Carabayllo  
 9     9 Baseline Dosis 2    30 SMP         
10    10 Baseline Placebo    38 Pueblo Libre
# … with 43 more rows
  • Podemos querer filtrar a los individuos en la medición basal Y que sean placebo:
datos_fase1_select %>% 
  filter(time == "Baseline" & treat == "Placebo")
# A tibble: 17 × 5
      id time     treat     age procedence       
   <dbl> <fct>    <fct>   <dbl> <chr>            
 1     1 Baseline Placebo    33 Callao           
 2     5 Baseline Placebo    31 La Molina        
 3     6 Baseline Placebo    38 Los Olivos       
 4     8 Baseline Placebo    34 Carabayllo       
 5    10 Baseline Placebo    38 Pueblo Libre     
 6    14 Baseline Placebo    33 Surquillo        
 7    15 Baseline Placebo    37 Comas            
 8    17 Baseline Placebo    40 Surquillo        
 9    18 Baseline Placebo    36 Miraflores       
10    20 Baseline Placebo    22 Surquillo        
11    21 Baseline Placebo    29 SJL              
12    25 Baseline Placebo    37 San Borja        
13    26 Baseline Placebo    32 Chosica          
14    40 Baseline Placebo    20 VES              
15    43 Baseline Placebo    36 Villa el Salvador
16    45 Baseline Placebo    35 Los Olivos       
17    48 Baseline Placebo    27 Callao           
datos_fase1_select %>% 
  filter(time == "Baseline", treat == "Placebo")
# A tibble: 17 × 5
      id time     treat     age procedence       
   <dbl> <fct>    <fct>   <dbl> <chr>            
 1     1 Baseline Placebo    33 Callao           
 2     5 Baseline Placebo    31 La Molina        
 3     6 Baseline Placebo    38 Los Olivos       
 4     8 Baseline Placebo    34 Carabayllo       
 5    10 Baseline Placebo    38 Pueblo Libre     
 6    14 Baseline Placebo    33 Surquillo        
 7    15 Baseline Placebo    37 Comas            
 8    17 Baseline Placebo    40 Surquillo        
 9    18 Baseline Placebo    36 Miraflores       
10    20 Baseline Placebo    22 Surquillo        
11    21 Baseline Placebo    29 SJL              
12    25 Baseline Placebo    37 San Borja        
13    26 Baseline Placebo    32 Chosica          
14    40 Baseline Placebo    20 VES              
15    43 Baseline Placebo    36 Villa el Salvador
16    45 Baseline Placebo    35 Los Olivos       
17    48 Baseline Placebo    27 Callao           
  • Podemos querer filtrar a los individuos en la medición basal O que sean placebo:
datos_fase1_select %>% 
  filter(time == "Baseline" | treat == "Placebo")
# A tibble: 70 × 5
      id time     treat     age procedence 
   <dbl> <fct>    <fct>   <dbl> <chr>      
 1     1 Baseline Placebo    33 Callao     
 2     1 3 months Placebo    32 Callao     
 3     2 Baseline Dosis 2    27 Santa Anita
 4     3 Baseline Dosis 1    25 Callao     
 5     4 Baseline Dosis 1    37 Callao     
 6     5 Baseline Placebo    31 La Molina  
 7     5 3 months Placebo    32 La Molina  
 8     6 Baseline Placebo    38 Los Olivos 
 9     6 3 months Placebo    38 Los Olivos 
10     7 Baseline Dosis 1    26 SMP        
# … with 60 more rows
  • Si queremos solo las mujeres entre 34 y 38 años de edad:
datos_fase1_select %>% 
  filter(age >= 34 & age <= 38)
# A tibble: 36 × 5
      id time     treat     age procedence  
   <dbl> <fct>    <fct>   <dbl> <chr>       
 1     4 Baseline Dosis 1    37 Callao      
 2     4 3 months Dosis 1    38 Callao      
 3     6 Baseline Placebo    38 Los Olivos  
 4     6 3 months Placebo    38 Los Olivos  
 5     8 Baseline Placebo    34 Carabayllo  
 6     8 3 months Placebo    34 Carabayllo  
 7    10 Baseline Placebo    38 Pueblo Libre
 8    10 3 months Placebo    38 Pueblo Libre
 9    11 Baseline Dosis 2    37 El Agustino 
10    11 3 months Dosis 2    36 El Agustino 
# … with 26 more rows
  • Si queremos a quienes son de Santa Anita, Callao, SMP o Carabayllo:
datos_fase1 %>% 
  filter(procedence == "Santa Anita" | procedence == "Callao" | procedence == "SMP")
# A tibble: 22 × 14
      id time  treat   age race  married married2 procedence weight height    e2
   <dbl> <fct> <fct> <dbl> <chr> <fct>   <fct>    <chr>       <dbl>  <dbl> <dbl>
 1     1 Base… Plac…    33 Mest… Single  Without… Callao       59      1.4  87.3
 2     1 3 mo… Plac…    32 Mest… Single  Without… Callao       59.9    1.3 210. 
 3     2 Base… Dosi…    27 Mest… Single  Without… Santa Ani…   62      1.5 169. 
 4     2 3 mo… Dosi…    27 Mest… Single  Without… Santa Ani…   62.1    1.6  99.9
 5     3 Base… Dosi…    25 Mest… Single  Without… Callao       62      1.6  78.8
 6     3 3 mo… Dosi…    25 Mest… Single  Without… Callao       60      1.6 155. 
 7     4 Base… Dosi…    37 Mest… Divorc… Without… Callao       60.9    1.5  41.0
 8     4 3 mo… Dosi…    38 Mest… Divorc… Without… Callao       61.4    1.5 109. 
 9     7 Base… Dosi…    26 Mest… Married With co… SMP          59.1    1.6  91.3
10     7 3 mo… Dosi…    26 Mest… Married With co… SMP          58.6    1.6  91.3
# … with 12 more rows, and 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>
datos_fase1 %>% 
  filter(procedence %in% c("Santa Anita", "Callao", "SMP"))
# A tibble: 22 × 14
      id time  treat   age race  married married2 procedence weight height    e2
   <dbl> <fct> <fct> <dbl> <chr> <fct>   <fct>    <chr>       <dbl>  <dbl> <dbl>
 1     1 Base… Plac…    33 Mest… Single  Without… Callao       59      1.4  87.3
 2     1 3 mo… Plac…    32 Mest… Single  Without… Callao       59.9    1.3 210. 
 3     2 Base… Dosi…    27 Mest… Single  Without… Santa Ani…   62      1.5 169. 
 4     2 3 mo… Dosi…    27 Mest… Single  Without… Santa Ani…   62.1    1.6  99.9
 5     3 Base… Dosi…    25 Mest… Single  Without… Callao       62      1.6  78.8
 6     3 3 mo… Dosi…    25 Mest… Single  Without… Callao       60      1.6 155. 
 7     4 Base… Dosi…    37 Mest… Divorc… Without… Callao       60.9    1.5  41.0
 8     4 3 mo… Dosi…    38 Mest… Divorc… Without… Callao       61.4    1.5 109. 
 9     7 Base… Dosi…    26 Mest… Married With co… SMP          59.1    1.6  91.3
10     7 3 mo… Dosi…    26 Mest… Married With co… SMP          58.6    1.6  91.3
# … with 12 more rows, and 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>

Podemos anidar con %>% varias tareas


datos_fase1 %>% 
  filter(age > 35) %>% # Primero filtro por age
  select(id, time, treat, race, age) %>% # Luego me quedo solo con estas 5 columnas
  arrange(age) # Por último, reordenamos por edad
# A tibble: 40 × 5
      id time     treat   race      age
   <dbl> <fct>    <fct>   <chr>   <dbl>
 1    11 3 months Dosis 2 Mestiza    36
 2    18 Baseline Placebo Mestiza    36
 3    18 3 months Placebo Mestiza    36
 4    43 Baseline Placebo Mestiza    36
 5    43 3 months Placebo Mestiza    36
 6    46 Baseline Dosis 2 Mestiza    36
 7    46 3 months Dosis 2 Mestiza    36
 8     4 Baseline Dosis 1 Mestiza    37
 9    11 Baseline Dosis 2 Mestiza    37
10    15 Baseline Placebo Mestiza    37
# … with 30 more rows

Creación de nuevas columnas con mutate()


  • La función mutate() crea columnas nuevas o modifica existentes.

Larga

mutate(.data = DATA, ...)


Abreviada

mutate(DATA, ...)


Se estila usar %>%

DATA %>% 
  mutate(...)


Argumento Descripción
.data Data frame o extensión de data frame (por ejemplo, tibble).
... Columnas existente para modificar o columnas nuevas para crear.

mutate() en acción

  • Si queremos crear la variable índice de masa corporal:
datos_fase1 %>% 
  select(id, weight, height) %>% # Nos quedamos con peso y talla 
  mutate(imc = weight / height ^ 2) # Creamos IMC en base a peso y talla
# A tibble: 106 × 4
      id weight height   imc
   <dbl>  <dbl>  <dbl> <dbl>
 1     1   59      1.4  30.1
 2     1   59.9    1.3  35.4
 3     2   62      1.5  27.6
 4     2   62.1    1.6  24.3
 5     3   62      1.6  24.2
 6     3   60      1.6  23.4
 7     4   60.9    1.5  27.1
 8     4   61.4    1.5  27.3
 9     5   64      1.5  28.4
10     5   58.1    1.6  22.7
# … with 96 more rows
  • También podemos crear más de una variable nueva.

  • Incluso, podemos reutilizar la variable recién creada para crear otra nueva dentro del mismo argumento de mutate()

datos_fase1 %>% 
  select(id, weight, height) %>% 
  mutate(
    imc = weight / height ^ 2, 
    imc_escalado = imc / 10
    ) 
# A tibble: 106 × 5
      id weight height   imc imc_escalado
   <dbl>  <dbl>  <dbl> <dbl>        <dbl>
 1     1   59      1.4  30.1         3.01
 2     1   59.9    1.3  35.4         3.54
 3     2   62      1.5  27.6         2.76
 4     2   62.1    1.6  24.3         2.43
 5     3   62      1.6  24.2         2.42
 6     3   60      1.6  23.4         2.34
 7     4   60.9    1.5  27.1         2.71
 8     4   61.4    1.5  27.3         2.73
 9     5   64      1.5  28.4         2.84
10     5   58.1    1.6  22.7         2.27
# … with 96 more rows
  • Tener cuidado si se quiere reutilizar la variable original, en ese caso es mejor crear columna nueva.

  • Queremos que la edad sea reportada en meses:

Crear columna nueva:

datos_fase1 %>% 
  select(id, age) %>% 
  mutate(age2 = age * 12) # Columna nueva llamada age2
# A tibble: 106 × 3
      id   age  age2
   <dbl> <dbl> <dbl>
 1     1    33   396
 2     1    32   384
 3     2    27   324
 4     2    27   324
 5     3    25   300
 6     3    25   300
 7     4    37   444
 8     4    38   456
 9     5    31   372
10     5    32   384
# … with 96 more rows

Remplazar la edad:

datos_fase1 %>% 
  select(id, age) %>% 
  mutate(age = age * 12) # Notar que se remplazó age 
# A tibble: 106 × 2
      id   age
   <dbl> <dbl>
 1     1   396
 2     1   384
 3     2   324
 4     2   324
 5     3   300
 6     3   300
 7     4   444
 8     4   456
 9     5   372
10     5   384
# … with 96 more rows

Creación de variables con case_when()


  • Función de apoyo a mutate() para crear variables según condiciones más complejas.

  • Crea variables de acuerdo a condiciones complejas

case_when(
  condición1 ~ resultado1, 
  condición2 ~ resultado2, 
  condición3 ~ resultado3
  )
  • Toda transformación o creación de variables en dplyr ocurre por mutate; por tanto, case_when() se utiliza dentro de un mutate
datos %>% 
  mutate(
    nueva_var = case_when(
      condición1 ~ resultado1,
      condición2 ~ resultado2, 
      condición3 ~ resultado3
    )
  )
  • Atajo de teclado para obtener ~: Alt + 1 + 2 + 6

Condición no cumplida en case_when( )


  • Para indicar que todas las condiciones previas no se cumplen, se debe colocar TRUE:
datos %>% 
  mutate(
    nueva_var = case_when(
      condición1 ~ resultado1,
      condición2 ~ resultado2, 
      condición3 ~ resultado3, 
      TRUE ~ resultado_si_condición_no_se_cumple
    )
  )
  • Es muy importante siempre colocarla al final de cualquier conjunto de condiciones previas.

  • Cuando el resultado de no cumplirse es que se asigne valor perdido, es importante usar la función as.tipo_var() sobre el indicador de dato perdido NA.

    • Si es character: as.character(NA)

    • Si es numeric: as.numeric(NA)

case_when() en acción

  • Se quieren crear categorías de edad: “20-30”, “31-35” y “36-41”
datos_fase1 %>% 
  select(id, age) %>% 
  mutate(agecat = case_when(age >= 20 & age <= 30 ~ "20-30", 
                            age >= 31 & age <= 35 ~ "31-35", 
                            age >= 36 & age <= 41 ~ "36-41", 
                            TRUE ~ as.character(NA))
         ) 
# A tibble: 106 × 3
      id   age agecat
   <dbl> <dbl> <chr> 
 1     1    33 31-35 
 2     1    32 31-35 
 3     2    27 20-30 
 4     2    27 20-30 
 5     3    25 20-30 
 6     3    25 20-30 
 7     4    37 36-41 
 8     4    38 36-41 
 9     5    31 31-35 
10     5    32 31-35 
# … with 96 more rows
  • Se desea crear variable indicadora de inclusión en estudio: Solo pacientes sin pareja y que proceden de Callao, Carabayllo, Chorrillos o SJL son elegibles:
datos_fase1 %>% 
  mutate(elegible = case_when(
    married2 == "Without couple" & procedence %in% c("Callao", "Carabayllo", "Chorrillos", "SJL") ~ "Elegible", 
    TRUE ~ "No elegible"
    )
  ) 
# A tibble: 106 × 15
      id time  treat   age race  married married2 procedence weight height    e2
   <dbl> <fct> <fct> <dbl> <chr> <fct>   <fct>    <chr>       <dbl>  <dbl> <dbl>
 1     1 Base… Plac…    33 Mest… Single  Without… Callao       59      1.4  87.3
 2     1 3 mo… Plac…    32 Mest… Single  Without… Callao       59.9    1.3 210. 
 3     2 Base… Dosi…    27 Mest… Single  Without… Santa Ani…   62      1.5 169. 
 4     2 3 mo… Dosi…    27 Mest… Single  Without… Santa Ani…   62.1    1.6  99.9
 5     3 Base… Dosi…    25 Mest… Single  Without… Callao       62      1.6  78.8
 6     3 3 mo… Dosi…    25 Mest… Single  Without… Callao       60      1.6 155. 
 7     4 Base… Dosi…    37 Mest… Divorc… Without… Callao       60.9    1.5  41.0
 8     4 3 mo… Dosi…    38 Mest… Divorc… Without… Callao       61.4    1.5 109. 
 9     5 Base… Plac…    31 Mest… Single  Without… La Molina    64      1.5  43.0
10     5 3 mo… Plac…    32 Mest… Single  Without… La Molina    58.1    1.6  56.0
# … with 96 more rows, and 4 more variables: lh <dbl>, fsh <dbl>, prog <dbl>,
#   elegible <chr>

Otros verbos útiles para manejo de datos

Renombrar variables con rename()

  • Cambia los nombres de variables individuales.

Larga

rename(.data = DATA, ...)


Abreviada

rename(DATA, ...)


Se estila usar %>%

DATA %>% 
  rename(...)


Argumento Descripción
.data Data frame o extensión de data frame (por ejemplo, tibble).
... nuevo_nombre = viejo_nombre

rename() en acción


  • Cambiar el nombre de married por casado1 y el de age por edad.
datos_fase1 %>% 
  rename(
    casado1 = married, 
    edad = age
    )
# A tibble: 106 × 14
      id time  treat  edad race  casado1 married2 procedence weight height    e2
   <dbl> <fct> <fct> <dbl> <chr> <fct>   <fct>    <chr>       <dbl>  <dbl> <dbl>
 1     1 Base… Plac…    33 Mest… Single  Without… Callao       59      1.4  87.3
 2     1 3 mo… Plac…    32 Mest… Single  Without… Callao       59.9    1.3 210. 
 3     2 Base… Dosi…    27 Mest… Single  Without… Santa Ani…   62      1.5 169. 
 4     2 3 mo… Dosi…    27 Mest… Single  Without… Santa Ani…   62.1    1.6  99.9
 5     3 Base… Dosi…    25 Mest… Single  Without… Callao       62      1.6  78.8
 6     3 3 mo… Dosi…    25 Mest… Single  Without… Callao       60      1.6 155. 
 7     4 Base… Dosi…    37 Mest… Divorc… Without… Callao       60.9    1.5  41.0
 8     4 3 mo… Dosi…    38 Mest… Divorc… Without… Callao       61.4    1.5 109. 
 9     5 Base… Plac…    31 Mest… Single  Without… La Molina    64      1.5  43.0
10     5 3 mo… Plac…    32 Mest… Single  Without… La Molina    58.1    1.6  56.0
# … with 96 more rows, and 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>

Etiquetar variables con set_var_labels()


  • La función set_var_labels() del paquete labelled() es muy útil para etiquetar columnas.

  • Los datos deben tener metadatos que permitan ser legibles por el ser humano.

  • Primero instalar y cargar paquete:

library(labelled)
  • Es preferible usar esta función al final de todo el proceso de limpieza de datos.

Larga

set_var_labels(.data = DATA, ...)


Abreviada

set_var_labels(DATA, ...)


Se estila usar %>%

DATA %>% 
  set_var_labels(...)


Argumento Descripción
.data Data frame o extensión de data frame (por ejemplo, tibble).
... variable = 'nueva etiqueta'

set_var_labels() en acción

  • ¿Qué significan pas, pad y pam?

  • Difícil de saber sin una etiqueta

  • Usando set_variable_labels()
datos2 <- datos %>% 
  set_variable_labels(
    pam = "Presión Arterial Media", 
    pas = "Presión Arterial Sistólica", 
    pad = "Presión Arterial Diastólica"
  )

Nuestro turno


  • Cree una carpeta de trabajo en Documentos, llámela mi_primer_manejo_datos.
  • Cree un proyecto de Rstudio y ubíquelo en la carpeta nueva mi_primer_manejo_datos.
  • Abra el archivo mi_primer_manejo_datos y completelo según las indicaciones.
  • Compile el archivo quarto, verifique que se creó el html, ábralo y explórelo.




05:00